package com.y3k.model;

import java.net.URL;

import org.apache.commons.codec.binary.Base64;

import com.y3k.commons.file.FileUtil;
import com.y3k.commons.license.data.Customer;
import com.y3k.commons.license.validator.LicenseValidator;

public class LicenseLoader {

	private Customer customer;

	private Object object;

	private static LicenseLoader instance;

	public static LicenseLoader getInstance() {
		if (instance == null)
			instance = new LicenseLoader();
		return instance;
	}

	private LicenseLoader() {

	}

	public Customer getCustomer() {
		return customer;
	}

	public void setCustomer(Customer customer) {
		this.customer = customer;
	}

	public Object getObject() {
		return object;
	}

	public void setObject(Object object) {
		this.object = object;
	}

	public boolean isTrial() {
		return customer.isTrial();
	}

	// Verifica que el archivo de licencia haya sido firmado con el certificado y no haya sido adulterado
	public boolean isValid() {
		boolean valid = false;

		try {			
			URL licenseUrl = Thread.currentThread().getContextClassLoader().getResource("resources/license/license.dat");			
			URL y3kCertUrl = Thread.currentThread().getContextClassLoader().getResource("resources/license/y3k.cer");
			
/*			//TODO  reemplazar los %20 en windows por espacio
			String licensePath = "";
			String y3kCertPath = "";
			
			// Si el sistema operativo del server es windows, reemplazar los %20 por espacios para que no falle en la localizacion de los archivos
			if (System.getProperty("os.name").contains("Windows")){
				licensePath = licenseUrl.getPath().replaceAll("%20", " ");
				y3kCertPath = y3kCertUrl.getPath().replaceAll("%20", " ");
			}*/

			LicenseValidator validator = new LicenseValidator(licenseUrl.getPath(), y3kCertUrl.getPath());
//			LicenseValidator validator = new LicenseValidator(licensePath, y3kCertPath);			
			
			customer = validator.getCustomer();
			if (validator.valid()) {
				valid = true;
			}
		} catch (Exception ex) {
			ex.printStackTrace();
			valid = false;
		}
		return valid;
	}

	// Dada la cantidad de dias de la licencia y el archivo control.dat que tiene la fecha de registracion, retorna la cantidad de dias restantes
	public long getRemainingDays(int totalDays, CustomerInfo info) {
		URL controlUrl = Thread.currentThread().getContextClassLoader().getResource("resources/license/control.dat");
	
		//TODO  reemplazar los %20 en windows por espacio		
		
		String control = FileUtil.fileToString(controlUrl.getPath());		
		
		
		byte[] bytes = Base64.decodeBase64(control.getBytes());
		long dateMillis = Long.parseLong(new String(bytes));
		long now = System.currentTimeMillis();

		// Evitar agrandar la cantidad de dias restantes cuando diff da menor a cero
		if (dateMillis > now) {
			info.setResult(CustomerInfoMessagesHome.DATE_GREATER_THAN_TODAY);
			info.setMessage("Date of registration greater than today");
			
			return -1;
		}

		long diff = ((((now - dateMillis) / 1000) / 60) / 60) / 24;

		long remainingDays = totalDays - diff;

		return remainingDays;
	}
}
